RocketMQ Streams 概述
RocketMQ Streams 是一个基于 RocketMQ 的轻量级流计算引擎。它可以作为 SDK 依赖项应用,无需部署复杂的流计算服务器,使其资源高效、易于扩展,并拥有丰富的流计算操作符。
架构
数据由 RocketMQ-streams 从 RocketMQ 中消费,进行处理,最终写回 RocketMQ。
数据由 RocketMQ 消费者消费,进入处理拓扑,由操作符进行处理。如果流处理任务包含 keyBy 操作符,则需要根据 Key 对数据进行分组,并写入 shuffle 主题。后续操作符从 shuffle 主题消费。如果还存在 count 等有状态操作符,则计算需要读取和写入状态主题。计算完成后,结果将写回 RocketMQ。
消费模型
计算实例实际上依赖于 Rocket-streams SDK 的客户端。因此,计算实例消费 MQ,依赖于 RocketMQ 的负载均衡分配。计算实例的总数不能超过消费 MQ 的总数,否则,一些计算实例将处于等待状态,无法消费数据。
一个计算实例可以消费多个 MQ,在一个实例内,只有一个计算拓扑图。
状态
对于有状态的操作符,例如 count,必须先进行分组,然后再进行求和。分组操作符 keyBy 将根据分组键将数据重新写入 RocketMQ,并确保具有相同键的数据写入到同一个分区(此过程称为 shuffle),以确保具有相同键的数据被同一个消费者消费。状态由 RocksDB 本地加速,并由 RocketMQ 远程持久化。
扩展/缩容能力
当计算实例从 3 个减少到 2 个时,在 RocketMQ 集群消费模式下的负载均衡功能的帮助下,消费的 MQ 将在计算实例之间重新分配。Instance1 消费的 MQ2 和 MQ3 分配给 Instance2 和 Instance3,这两个 MQ 的状态数据也需要迁移到 Instance2 和 Instance3。这也意味着状态数据是根据原始数据分区 MQ 保存的;扩展只是相反的过程。